Spring笔记(一)—— 版本新特性

1. spring 2.0 和 2.5 的新特性

1.1 简介

JDK 版本要在 1.4.2 以上,Java 5 和 Java 6 都支持。
Spring 框架继续保持对 Java EE 1.3 及以后版本的兼容,完全支持 Java EE 5。
对服务器(应用服务器和Web服务器)的支持:

  • WebLogic:8.1、9.0、9.2、10
  • WebSphere:5.1、6.0、6.1
  • OC4J(Oracle):10.1.3、11
  • JBoss:3.2、4.0、4.2
  • Tomcat:4.1、5.0、5.5、6.0
  • Jetty:4.2、5.1、6.1
  • Resin:2.1、3.0、3.1
  • GlassFish:v1、v2

1.2 控制反转(IOC)容器

1.2.1 新的 bean 作用域

Spring2.0:IoC 容器中只支持 singleton 和 prototype 两个不同的 bean 作用域。
Spring2.5:还支持 request、session、global session 三个在 web 环境下使用的 bean 作用域,且提供了hooks,可以让用户创建自己的作用域。

1.2.2 更简单的 XML 配置

Spring2.5 对 Spring2.0 的 DTD 进行了更新,spring-beans-2.0.dtd 可在发布包下的 dist/resources 下找到。

1
2
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">

1.2.3 可扩展的 XML 编写

作为一个应用程序开发人员或第三方框架或产品的供应商,开发自定义标签,供其他开发人员把这些标签嵌入到自己的Spring配置文件里。

1.2.4 Annotation(注解)驱动配置

Spring 2.0 引入了一些用于配置的 annotation, 包括 @Transactional, @Required, @PersistenceContext /@PersistenceUnit
Spring 2.5 引入了用于配置的完整的 Annotation 集合: @Autowired,以及对 JSR-250 注解 @Resource, @PostConstruct, @PreDestroy 的支持。

1.2.5 在 classpath 中自动搜索组件

组件类会注解为 stereotype: @Component, @Repository, @Service, @Controller,取决于程序的上下文配置,这些组件会被自动搜索到,并且转变为 Spring bean 定义,而不需要为每个类都进行明确的配置。

1.3 面向切面编程(AOP)

1.3.1 更加简单的 AOP XML 配置

1.3.2 对 @AspectJ 切面的支持

1.3.3 对 bean 命名 pointcut 的支持

1.3.4 对 AspectJ 装载时织入的支持

1.4 中间层

1.4.1 在XML里更为简单的声明性事务配置

Spring 2.5 支持方便的注解驱动的事务管理,通过 context:load-time-weaver 和 tx:annotation-driven mode=”aspectj” 的联合使用进行事务管理。

1.4.2 对 Websphere 事务管理的完整支持

要自动探测底层的 JTA 事务平台,可以使用 Spring 2.5 的新 tx:jta-transaction-manager 配置元素。它会自动探测 BEA WebLogic 和 IBM WebSphere,注册正确的 PlatformTransactionManager。

1.4.3 JPA

Spring 2.5 对 OpenJPA 的支持升级到了 OpenJPA 1.0,支持 savepoint 这样的高级特性。

1.4.4 异步的JMS

在 Spring 2.0 之前,Spring 的 JMS 的作用局限于发送消息和同步接收消息。
Spring 2.0 提供对异步消息接收的完整支持。
在 Spring 2.5 中, JCA 风格的异步消息监听器设置也通过 GenericMessageEndpointManager 工具得到了支持。

1.4.5 JDBC

引入了新类,Spring 2.5 扩充了 SimpleJdbcTemplate 的功能,引入了 SimpleJdbcCall
和 SimpleJdbcInsert 操作对象。

1.5 Web 层

1.5.1 Spring MVC 合理的默认值

1.5.2 Portlet 框架

1.5.3 基于 Annotation 的控制器

1.5.4 Spring MVC 的表单标签库

1.5.5 对 Tiles 2,JSF 1.2,JAX-WS 支持

2. spring 3.x 的新特性

2.1 spring 3.0

2.1.1 Spring3.0 以后分成多个 jar 包

  • org.springframework.aop, 包含在应用中使用Spring的AOP特性时所需的类。
  • org.springframework.asm,Spring独立的asm程序,Spring2.5.6的时候需要 asm.jar 包,3.0开始提供自己独立的asm.jar
  • org.springframework.aspects,提供对AspectJ的支持,以方便的将面向切面的功能集成进IDE中,比如Eclipse AJDT.
  • org.springframework.beans,所有应用都要用到,它包含访问配置文件,创建和管理Bean以及进行反转共控制和依赖注入操作时所需的类
  • org.springframework.context,为 Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext 特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如 Velocity、 FreeMarker、 JasperReports 集成的类, 以及校验 Validation 方面的相关类。
  • org.springframework.context.support,包含支持缓存Cache(ehcache)JCA、JMX、邮件服务(Java Mail、Mail)COS、任务计划Scheduling(Timer、Quartz)方面的类。
  • org.springframework.core,包含 Spring 框架基本的核心工具类,Spring 其它组件要都要使用到这个包里的 类,是其它组件的基本核心。
  • org.springframework.expression,包含Spring 表达式语言相关的类,应用使用到SpEL时需要添加这个jar包。
  • org.springframework.instrument.tomcat,Spring3.0对Tomcat的连接池的集成。
  • org.springframework.instrument,Spring3.0 对服务器的代理接口。
  • org.springframework.jdbc,包含对 Spring 对 JDBC 数据访问进行封装的所有类。
  • org.springframework.jms,提供了对JMS1.0.2/1.1 的支持类。
  • org.springframework.orm,包含Spring对DAO特性集进行了扩展,使其支持iBATIS、JDO、OJB、TopLink,因+ 为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖spring-dao.jar里的类,用这个包时你需要同时包含 spring-dao.jar包。
  • org.springframework.oxm,Spring 对 Object/XMl 的映射支持,可以让Java与XML之间来回切换。
  • org.springframework.test,对Junit等测试框架的简单封装。
  • org.springframework.transaction,为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理。
  • org.springframework.web,包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。
  • org.springframework.web.portlet,对SpringMVC的增强,包含SpringMVC相关的类
  • org.springframework.web.servlet,对J2EE6.0的Servlet3.0的支持。
  • org.springframework.web.struts,对Struts框架支持,可以更方便更容易的集成Struts框架。

2.1.2 新增特性

  • Spring 表达式语言
  • 增强的 IOC 和基于 java 的 Bean 元数据
  • 通用类型转换系统和字段格式
  • 来自于 Srping Web Services 项目的对象和 XML 之间的映射
  • 增强的 REST 支持
  • @MVC additions (Spring的 MVC 注解增强)
  • 声明式模型验证
  • 提前对 JEE6 的支持
  • 嵌入式数据库的支持

2.1.3 基于 Java 5 的核心API的更新

  • BeanFactory接口尽可能的返回明确的实例:
    • T getBean(Class requiredType)
    • getBean(String name, Class requiredType)
    • Map getBeansOfType(Class type)
  • Spring 的 TaskExecutor 继承 java.util.concurrent.Executor 接口
    • 扩展的子接口 AsyncTaskExecutor 支持标准的具有返回结果 Futures 的 Callables
  • 基于 Java5 的 API 和 SPI 转换器
    • 无状态的 ConversionService 和 Converters
    • 取代标准的 JDK PropertyEditors
  • 类型化的 ApplicationListener

2.1.4 Spring 表达式语言(简称SpEL)

SpEL 使得 java 具有动态语言的风格,可以在运行时获取表达式的值。依赖注入时可以使用 SpEL 表达式语言, 不再只是原来简单的属性文件变量(xml)。
示例:

  • xml 配置:

    1
    2
    3
    4
    5
    6
    <bean class="mycompany.RewardsTestDatabase">
    <property name="databaseName"
    value="#{systemProperties.databaseName}"/>
    <property name="keyGenerator"
    value="#{strategyBean.databaseKeyGenerator}"/>
    </bean>
  • java 代码:

    1
    2
    3
    4
    5
    6
    7
    8
    @Repository
    public class RewardsTestDatabase {
    @Value("#{systemProperties.databaseName}")
    public void setDatabaseName(String dbName) { ... }
    @Value("#{strategyBean.databaseKeyGenerator}")
    public void setKeyGenerator(KeyGenerator kg) { ... }
    }

2.1.5 增强的 IOC 和基于 java 的 bean 配置

更多的注解的支持:@Configuration,@Bean,@DependsOn, @Primary,@Lazy,@Import,@ImportResource,@Value
示例:

  • xml 配置:

    1
    2
    3
    <context:component-scan base-package="org.example.config"/>
    <util:properties id="jdbcProperties"
    location="classpath:org/example/config/jdbc.properties"/>
  • 也可以使用如下代码来代替 xml 的配置:

    1
    2
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    FooService fooService = ctx.getBean(FooService.class);
  • java 代码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    package org.example.config;
    ...
    @Configuration
    public class AppConfig {
    private @Value("#{jdbcProperties.url}") String jdbcUrl;
    private @Value("#{jdbcProperties.username}") String username;
    private @Value("#{jdbcProperties.password}") String password;
    @Bean
    public FooService fooService() {
    return new FooServiceImpl(fooRepository());
    }
    @Bean
    public FooRepository fooRepository() {
    return new HibernateFooRepository(sessionFactory());
    }
    @Bean
    public SessionFactory sessionFactory() {
    // wire up a session factory
    AnnotationSessionFactoryBean asFactoryBean = new AnnotationSessionFactoryBean();
    asFactoryBean.setDataSource(dataSource());
    // additional config
    return asFactoryBean.getObject();
    }
    @Bean
    public DataSource dataSource() {
    return new DriverManagerDataSource(jdbcUrl, username, password);
    }
    }

2.1.6 通用类型转换系统和字段格式化系统

Spring3.0 加入了一个通用的类型转换系统,它被 SpEL 用作类型转换,并且可能被一个 Spring 容器使用,用于当绑定 bean 的属性值时进行类型转换。此外还增加了一个字段格式化系统,它提供了更简单且强大的功能以替代在客户端环境下的 Javabean 的 PropertyEidtors。

2.1.7 声明式模型验证

支持 JSR303,使用 Hibernate Validator 作为默认实现:

1
2
3
4
5
6
7
8
public class Person {
@NotNull
@Max(64)
private String name;
@Min(0)
private int age;
}

2.2 spring 3.1

2.2.1 新增特性

  • Cache 抽象
  • Bean 定义配置文件
  • Environment 抽象
  • PropertySource 抽象
  • 注解代替 xml 配置
  • 对 Hibernate 4.x 的支持
  • TestContext 框架对 @Configuration 和 Bean 定义配置文件 的支持
  • 更为简洁的构造函数注入 c: namespace
  • 非标准 setter 类的注入
  • Servlet 3 code-based configuration of Servlet Container 的支持
  • Servlet 3 MultipartResolver 的支持
  • 改善了 O/R 映射支持,允许无persistence.xml的JPA包扫描
  • 可以在 controller 中,使用 annotation 临时指定特殊的 Mapping 或者 ExceptionHandler,而且整个体系更加灵活和可扩展。

2.3 spring 3.2

2.3.1 新增特性

  • 支持基于Servlet 3的异步请求处理
  • Spring MVC Test框架
  • 内容协商(Content Negotiation)改进。ContentNeogtiationStrategy 现在可以根据传入请求确定请求的媒体类型。可用的实现是基于文件扩展名、查询参数、“Accept”头或者一个固定的内容类型。
  • @ControllerAdvice
  • 矩阵变量(Matrix Variables),增加了 @MatrixVariable 用于从请求URI中提取矩阵变量。
  • 增加了一个抽象基础类用于支持基于代码的Servlet 3+容器初始化。
  • ResponseEntityExceptionHandler,用于处理异常消息的转换,和 DefaultHandlerExceptionResolver 的区别在于,这个类返回 ModelAndView。
  • RestTemplate 和 @RequestBody 的参数支持泛型。
  • 支持Jackson JSON 2
  • 支持Tiles 3
  • 改进 @RequestBody。@RequestBody 和 @RequestPart 的参数现在可以跟随Error参数,使它可以在 @RequestMapping 方法中处理验证的错误,@RequestBody 现在有一个 required 属性。
  • HTTP PATCH 方法。HTTP PATCH方法现在可用于@RequestMapping
  • 拦截器(Interceptor)支持 URL patterns
  • 在注入点(Injection Point)和Bean方法定义中使用元注解
  • 初步支持JCache 0.5
  • @DateTimeFormat不再依赖Joda Time
  • 全局日期时间格式化
  • 新的测试特性
  • 并发性的微调
  • 基于Gradle的构建系统,并迁移到GitHub
  • 支持Java SE 7和OpenJDK 7

3. spring 4.x 的新特性

3.1 spring 4.0

3.1.1 新增特性

  • 删除了被丢弃的包和方法
  • Java 8 的支持,最低需要 Java 6
  • 使用 Java EE 6 或以上的版本来作为基线,同时包含了相关的 JPA2.0 和 Servlet3.0 的规范
  • 使用 Groovy 的 DSL(DomainSpecific Languages)来定义 Bean
  • 核心容器的改进
    • Spring 注入 Bean 的时候把泛型类型当成一种形式的限定符。使用 Spring DataRepository 可以方便的插入特定的实现:@Autowired Repository customerRepository。
    • 使用 Spring 的元注解支持,可以开发自定义注解来公开源注解的特定属性。
    • 当自动装配到 lists 和 arrays 时,Beans 可以被排序,支持 @Order 注解和 Ordered 接口两种方式。 @Lazy 注解可以用在注入点以及 @Bean 定义上。
    • 引入 @Description 注解,开发人员可以使用基于Java 方式的配置。
    • 根据条件筛选 Beans 的广义模型通过 @Conditional 注解加入。这和@Profile支持的类似,但是允许以编程式开发用户定义的策略。
    • 基于 CGLIB 的代理类不在需要默认的构造方法。
    • 框架支持管理时区。
  • 常规 Web 改进
    • 在 Spring MVC 应用中使用新的 @RestController 注解时,不再需要给 @RequestMapping 的方法添加 @ResponseBody 注解。
    • AsyncRestTemplate 类已被添加进来,当开发 REST 客户端时,允许非阻塞异步支持。
    • 当开发 Spring MVC 应用时,Spring 现在提供了全面的时区支持
  • WebSocket, SockJS 和 STOMP 消息
  • 测试改进,引入了几个用于单元测试和集成测试的新功能
    • 几乎 spring-test 模块中所有的注解(例如:@ContextConfiguration、@WebAppConfiguration、@ContextHierarchy、@ActiveProfiles 等等)可以用作元注解来创建自定义的 composed annotations 并且可以减少测试套件的配置。
    • 现在可以以编程方式解决 Bean 定义配置文件的激活。只需要实现一个自定义的 ActiveProfilesResolver,并且通过 @ActiveProfiles的resolver 属性注册。
    • 新的 SocketUtils 类被引入到了 spring-core 模块。

3.2 spring 4.1

3.2.1 新增特性

  • 核心部分基本上无变化,提供了 DirectFieldAccessor 用于直接字段访问、yaml 配置、SpEL 的字节码编译化、BackOff 退避算法的基本实现、Base64Utils、SmartInitializingSingleton等;
  • 在任务调度和事件机制上加入了异常处理部分;
  • cache 部分加入 jcache 的集成、类级别的 @CacheConfig 的支持、CacheResolver;
  • mvc 部分提供了一些视图解析器的 mvc 标签实现简化配置、提供了 GroovyWebApplicationContext 用于 Groovy web 集成、提供了 Gson、protobuf 的 HttpMessageConverter、静态资源处理方面添加了 resolver和 transformer、提供了对 groovy-templates 模板的支持、JSONP 的支持、对 Jackson 的 @JsonView 的支持等;
  • 提供了页面自动化测试框架 Spring MVC Test HtmlUnit;
  • test 部分提供了更便利的 @sql 标签来执行测试脚本的初始化、MockRestServiceServer 对 AyncRestTemplate 支持、MockMvcConfigurer 来全局配置 MockMvc;
  • 提供了对 Java 8 Optional 的支持(ObjectToOptionalConverter 实现;可以在MVC中如 @RequestParam 等注解的绑定)、从Spring 4.1起 Ehcache 支持需要 EhCache 2.5 或更高版本、兼容 Quartz 2.1.4、支持 javax.annotation.Priority(等价于@Order)、JMS API的增强、SpringJUnit4ClassRunner 需要 JUnit 4.9或更高版本支持。

参考资料:

开涛的博客–Spring 4.1 新特性——综述
BigZ的专栏–Spring 4.0 新功能和增强
中文翻译 Spring Framework 4.x参考文档

热评文章